From: Stéphane Démurget Date: Sun, 4 Nov 2012 18:47:11 +0000 (+0100) Subject: panel: programmatic anim. control of AnimatedIcon X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~5497 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=e04a4c39231ea1418591446d9b98aad4d7bcd2de;p=gnome-shell.git panel: programmatic anim. control of AnimatedIcon The AnimatedIcon does not have an API for controlling the animation but relies on the :visible property changes to start and stop a timeout used to update the frame. This has the inconvenient of having a side effect when visible is set to true multiple times, and is not really the API expected from such component. Switch to a start/stop API instead. Also, update to the first frame at startup while we are at it, since this is the expected behavior. https://bugzilla.gnome.org/show_bug.cgi?id=687583 --- diff --git a/js/ui/panel.js b/js/ui/panel.js index 9f3696346..2c3fc89a6 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -82,28 +82,27 @@ const AnimatedIcon = new Lang.Class({ _init: function(name, size) { this.actor = new St.Bin({ visible: false }); this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); - this.actor.connect('notify::visible', Lang.bind(this, this._onVisibleNotify)); this._timeoutId = 0; this._frame = 0; this._animations = St.TextureCache.get_default().load_sliced_image (global.datadir + '/theme/' + name, size, size); this.actor.set_child(this._animations); + + this._update(); + }, + + start: function() { + if (this._timeoutId == 0) + this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update)); }, - _disconnectTimeout: function() { + stop: function() { if (this._timeoutId > 0) { Mainloop.source_remove(this._timeoutId); this._timeoutId = 0; } }, - _onVisibleNotify: function() { - if (this.actor.visible) - this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update)); - else - this._disconnectTimeout(); - }, - _showFrame: function(frame) { let oldFrameActor = this._animations.get_child_at_index(this._frame); if (oldFrameActor) @@ -122,7 +121,7 @@ const AnimatedIcon = new Lang.Class({ }, _onDestroy: function() { - this._disconnectTimeout(); + this.stop(); } }); @@ -367,6 +366,7 @@ const AppMenuButton = new Lang.Class({ transition: "easeOutQuad", onCompleteScope: this, onComplete: function() { + this._spinner.stop(); this._spinner.actor.opacity = 255; this._spinner.actor.hide(); } @@ -376,6 +376,7 @@ const AppMenuButton = new Lang.Class({ startAnimation: function() { this._stop = false; this.actor.reactive = false; + this._spinner.start(); this._spinner.actor.show(); },